#include <stdlib.h>

int* stworz_tab_we(char *v, int n) {  // funkcja tworzaca tablice zawierajaca wejscie
	int i;
	int* tab_we = malloc(n*sizeof *tab_we); //tworze miejsce na tablice
	
	for(i = 0; v[i] != '\0'; i++) { //wypelnienie tablicy
		if(v[i] == '1')
			tab_we[i] = 1;
		else if(v[i] == '0')
			tab_we[i] = 0;
	}
	return tab_we;
}

int* stworz_tab_st(int *tab_we, const int *q, int *tab_p, int state, int n) {// stworz tablice zawierajaca stany tab_we <- tablica z wejsciem, q <- mozliwe stany, state <- stan poczatkowy
	int i;
	int *tab_s = malloc((n+1)*sizeof *tab_s); //inicjacja tablicy zawierajacej stany 
	
	tab_s[0] = state;

	for(i = 0; i < n; i++) {
		if(state == q[0]){
			if(tab_we[i] == 0) {
				tab_s[i+1] = q[2]; //i+1, bo stan poczatkowy zapisany jako tab_s[0]
				state = q[2];
				tab_p[i] = 1;
			} else if(tab_we[i] == 1) {
				tab_s[i+1] = q[1];
				state = q[1];
				tab_p[i] = 2;
			}
		} else if(state == q[1]) {
			if(tab_we[i] == 0) {
				tab_s[i+1] = q[3];
				state = q[3];
				tab_p[i] = 3;
			} else if(tab_we[i] == 1) {
				tab_s[i+1] = q[0];
				state = q[0];
				tab_p[i] = 4;
			}
		} else if(state == q[2]) {
			if(tab_we[i] == 0) {
				tab_s[i+1] = q[0];
				state = q[0];
				tab_p[i] = 5;
			} else if(tab_we[i] == 1) {
				tab_s[i+1] = q[3];
				state = q[3];
				tab_p[i] = 6;
			}
		} else if(state == q[3]) {
			if(tab_we[i] == 0) {
				tab_s[i+1] = q[1];
				state = q[1];
				tab_p[i] = 7;
			} else if(tab_we[i] == 1) {
				tab_s[i+1] = q[2];
				state = q[2];
				tab_p[i] = 8;
			}
		}
	}
	return tab_s;
}

int zaakceptowany(const int *tab_s, const int n, const int *q, const int ending) {
		if(tab_s[n] == ending)
				return 1;
		else
				return 0;
	}

